#ifndef CHARTWINDOW_H
#define CHARTWINDOW_H

#include <QMainWindow>
#include <QVBoxLayout>
#include <QPushButton>
#include <QEvent>

// 先包含QtGlobal以确保QT_VERSION_CHECK宏可用
#include <QtGlobal>

// 根据Qt版本选择正确的命名空间处理方式
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
    #include <QtCharts> // Qt 6中使用通用头文件
#else
    #include <QtCharts/QChart>
    #include <QtCharts/QChartView>
    #include <QtCharts/QLineSeries>
    #include <QtCharts/QValueAxis>
    #ifndef QT_CHARTS_USE_NAMESPACE
        #define QT_CHARTS_USE_NAMESPACE
    #endif
    QT_CHARTS_USE_NAMESPACE // Qt 5中使用这个宏启用命名空间
#endif

class ChartWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit ChartWindow(QWidget *parent = nullptr);
    ~ChartWindow();
    
    // 添加数据点到图表的方法
    void addDataPoint(double x, double y);
    
    // 设置图表标题
    void setChartTitle(const QString &title);
    
    // 设置坐标轴范围
    void setAxisRanges(double minX, double maxX, double minY, double maxY);
    
    // 清除图表数据
    void clearData();
    
    // 设置最大数据点数量
    void setMaxPoints(qint64 maxPoints);
    
    // 一键自动锁定最优图形界面
    void autoFitView();
    
    // 事件过滤器，用于处理数据点拖动
    bool eventFilter(QObject *obj, QEvent *e) override;
    
    // 设置采样时间
    void setSampleTime(int sampleTime);
    
    // 更新UI控件显示但不触发信号
    void updateControlsSilently(qint64 newMaxPoints, int newSampleTime);
    
    // 在没有新数据时更新时间轴，添加0值数据点
    void updateTimeAxisWithoutData();

signals:
    // 当清除数据时发出的信号，通知主窗口重置数据计数器
    void resetDataCounter();
    
    // 当采样点数量更改时发出的信号
    void sampleSizeChanged(qint64 newSize);
    
    // 当采样时间更改时发出的信号
    void sampleTimeChanged(int newTime);

private:
    QChart *chart;
    QChartView *chartView;
    QLineSeries *series;
    QDateTimeAxis *axisX; // 改为QDateTimeAxis类型
    QValueAxis *axisY;
    
    // 时间轴相关成员变量
    QDateTime firstDataTime; // 记录第一个数据点的时间戳
    bool firstDataReceived; // 标记是否已经收到第一个数据点
    qint64 maxPoints; // 从int改为qint64，确保与MainWindow类型匹配
    QPushButton *clearButton;
    QPushButton *autoFitButton; // 自动锁定按钮
    
    // 用于数据点拖动的成员变量
    int dragPointIndex; // 当前拖动的数据点索引
    bool isDragging;    // 是否正在拖动数据点
    
    // 采样参数调整控件
    QLineEdit *sampleSizeEdit;  // 采样点数量手动输入
    QLineEdit *sampleTimeEdit;  // 采样时间范围手动输入
    QLabel *sampleSizeLabel;    // 显示当前采样点数量
    QLabel *sampleTimeLabel;    // 显示当前采样时间
    QLabel *sampleSizeRangeLabel;  // 采样点数量范围提示
    QLabel *sampleTimeRangeLabel;  // 采样时间范围提示
    
    void initChart();
    void initControls(QVBoxLayout *mainLayout);
};

#endif // CHARTWINDOW_H